import cv2
import numpy as np


# Resolve errors in Chinese paths

# def cv_imread(file_path):
#     cv_img = cv2.imdecode(np.fromfile(file_path, dtype=np.uint8), -1)
#     # imdecode读取的是rgb，如果后续需要opencv处理的话，需要转换成bgr，转换后图片颜色会变化
#     # cv_img = cv2.cvtColor(cv_img,cv2.COLOR_RGB2BGR)
#     return cv_img


# 这段代码用于读取包含中文路径的图像文件，是 cv2.imread() 函数的替代方案，专门解决OpenCV无法直接读取中文路径文件的问题。
# 2. 参数详解
# np.fromfile(filePath, dtype=np.uint8):
# np.fromfile(): 以二进制方式读取文件内容
# filePath: 图像文件路径（可以包含中文）
# dtype=np.uint8: 指定读取的数据类型为8位无符号整数
# cv2.imdecode(..., -1):
# cv2.imdecode(): 解码图像数据
# -1: 标志位，表示按原图格式读取（包括alpha通道）


def cv_imread(file_path):
    """
    读取包含中文路径的图片
    :param file_path: 图片路径（可含中文）
    :return: 读取的图片矩阵
    """
    # 以二进制方式读取文件
    with open(file_path, 'rb') as f:
        # 将文件内容转换为numpy数组
        file_data = np.frombuffer(f.read(), dtype=np.uint8)
        # 解码为OpenCV可用的图片格式
        img = cv2.imdecode(file_data, cv2.IMREAD_COLOR)
    return img


def cv_imwrite(file_path, img):
    """
    写入包含中文路径的图片
    :param file_path: 保存路径（可含中文）
    :param img: 要保存的图片矩阵
    :return: 是否保存成功
    """
    # 编码图片格式
    ext = file_path.split('.')[-1].lower()
    if ext in ['jpg', 'jpeg']:
        encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), 90]
        result, encimg = cv2.imencode('.jpg', img, encode_param)
    elif ext == 'png':
        encode_param = [int(cv2.IMWRITE_PNG_COMPRESSION), 3]
        result, encimg = cv2.imencode('.png', img, encode_param)
    else:
        # 默认使用JPEG格式
        result, encimg = cv2.imencode('.jpg', img)

    if result:
        with open(file_path, 'wb') as f:
            encimg.tofile(f)
        return True
    return False